package com.roy.jarvis.config.langchian4j;

import dev.ai4j.openai4j.chat.ResponseFormatType;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.redis.RedisEmbeddingStore;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import dev.langchain4j.store.memory.chat.redis.RedisChatMemoryStore;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 山顶洞人郑某
 * @className GptConfig.java 大模型配置
 * @date 2025 04 07
 */
@Configuration
public class GptConfig {
    @Value("${gpt.apiKey}")
    private String apiKey;
    @Value("${gpt.modeName}")
    private String modeName;

    @Bean
    public OpenAiChatModel openAiChatModel() {
        return OpenAiChatModel.builder()
                .apiKey(apiKey)
                .strictJsonSchema(true) // 启用严格模式，即要求返回的 JSON 符合指定的格式
                .logRequests(true)
                .logResponses(true)
               // .responseFormat(ResponseFormatType.JSON_OBJECT.name())
                .maxRetries(3) // 设置最大重试次数
                .temperature(0.7)
                .user("你是贾维斯，托尼·斯塔克的AI助手")
                .modelName(modeName)
                .build();
    }


    /**
     * 配置向量化模型
     * @return
     */
    @Bean
    public OpenAiEmbeddingModel openAiEmbeddingModel() {
        return OpenAiEmbeddingModel.builder()
                .logRequests(true) // 打印请求和响应
                .apiKey(apiKey)
                .modelName(modeName)
                .logResponses(true)
                .dimensions(1536)
                .build();
    }

    /**
     * 配置向量存储库
     * @return
     */
    @Bean
    public RedisEmbeddingStore redisEmbeddingStore() {
        return RedisEmbeddingStore
                .builder()
                .dimension(1536)
                .host("127.0.0.1")
                .port(6379)
                .indexName("Jarvis")
                .build();
    }

    /**
     * 配置信息检索增强器
     * @param openAiEmbeddingModel 向量化模型
     * @param redisEmbeddingStore 向量存储库
     * @return
     */
    @Bean
    public ContentRetriever contentRetriever(OpenAiEmbeddingModel openAiEmbeddingModel,RedisEmbeddingStore redisEmbeddingStore) {
        return EmbeddingStoreContentRetriever.builder()
                .minScore(0.5)
                .maxResults(10)
                .embeddingModel(openAiEmbeddingModel) //向量化模型
                .embeddingStore(redisEmbeddingStore) //向量存储库
                .build();
    }

    @Bean
    public ChatMemoryStore chatMemoryStore() {
        return RedisChatMemoryStore.builder()
                .host("127.0.0.1")
                .port(6379)
                .build();
    }
}
